//============================================================================================
/**
 * @file	pms_data.h
 * @brief	簡易文章（簡易会話データと定型文を組み合わせた文章）
 * @author	taya
 * @date	05.12.27
 */
//============================================================================================
#ifndef __PMS_DATA_H__
#define __PMS_DATA_H__


#define  PMS_WORD_NULL		(0xffff)	///< 単語として無効な値

#ifndef	__ASM_NO_DEF_

#include "gflib\strbuf.h"
#include "savedata\b_tower_def.h"

//------------------------------------------------------
/**
 *  関連定数
 */
//------------------------------------------------------
#define  PMS_WORD_MAX		(2)			///< 文中に含まれる単語の最大数


//------------------------------------------------------
/**
 *  文章タイプ
 */
//------------------------------------------------------
enum  PMS_TYPE {
	PMS_TYPE_BATTLE_READY,	///< 対戦開始前
	PMS_TYPE_BATTLE_WON,	///< 対戦勝ったとき
	PMS_TYPE_BATTLE_LOST,	///< 対戦負けた時
	PMS_TYPE_MAIL,			///< メールあいさつ
	PMS_TYPE_UNION,			///< ユニオンあいさつ


	PMS_TYPE_MAX,
};

///各文章タイプごとの文章登録数
#define PMS_TYPE_DATA_NUM_MAX	(20)	//1タイプにつき20個固定
#define PMS_SENTENCE_NUM_MAX	(PMS_TYPE_DATA_NUM_MAX*PMS_TYPE_MAX)	//文章総数

//------------------------------------------------------
/**
 *  単語型定義
 */
//------------------------------------------------------
typedef	u16		PMS_WORD;


//------------------------------------------------------
/**
 *  文章型定義
 *
 *  構造体内容が公開されていますが、
 *  勝手にメンバを参照したり書き換えたりしてはいけません。
 *  必要な処理はインターフェイス関数を通してのみ行ってください。
 *
 *（公開されているのは、この構造体を含む構造体（メール等）を
 * セーブデータ用に定義しなければならないためです）
 *
 */
//------------------------------------------------------
typedef struct {
	u16				sentence_type;			///< 文章タイプ
	u16				sentence_id;			///< タイプ内ID
	PMS_WORD		word[PMS_WORD_MAX];		///< 単語ID
}PMS_DATA;

///inclue/system/pms_word.res内の PMSW_SRC_XXXと並びを同じにしておく
//ホントはコンバーターでincludeできるファイルを吐き出すべきだけど暇がないので仮定義 by iwasawa
typedef enum {
 PMSW_SRC_ID_POKEMON,
 PMSW_SRC_ID_SKILL,
 PMSW_SRC_ID_TYPE,
 PMSW_SRC_ID_TOKUSEI,
 PMSW_SRC_ID_TRAINER,
 PMSW_SRC_ID_HITO,
 PMSW_SRC_ID_AISATSU,
 PMSW_SRC_ID_SEIKATSU,
 PMSW_SRC_ID_KIMOTI,
 PMSW_SRC_ID_NANKAI,
 PMSW_SRC_ID_UNION,
 PMSW_SRC_ID_MAX,
}PMSW_SRC_ID;

/*
 *	@brief	デフォルト文初期化データ構造体型
 *
 *	PMSDAT_SetupDefaultMessageに渡すデータ構造体
 */
typedef struct _PMS_DEFAULT_MSG{
	u8	sentence_type;		///< 文章タイプ PMS_TYPE_XXXXX
	u8	sentence_id;		///< タイプ内ID pmss_***.gmm内ID
	s8	word1_gmmID;	///<ワードgmmID PMSW_SRC_ID PMSW_SRC_ID_XXXX(未指定の場合-1)
	s8	word2_gmmID;
	u16 word1_wordID;
	u16 word2_wordID;
}PMS_DEFAULT_MSG;

//------------------------------------------------------------------
/**
 * 構造体を空文章としてクリアする
 *
 * @param   pms
 *
 */
//------------------------------------------------------------------
extern void PMSDAT_Clear( PMS_DATA* pms );

//------------------------------------------------------------------
/**
 * 状態初期化
 *
 * @param   pms				文章型領域へのポインタ
 * @param   sentence_type	文章タイプ
 *
 * ※ここでの文章タイプは、入力画面遷移後のデフォルト値として参照される。
 *   入力画面での編集後、異なる文章タイプになっていることはあり得る。
 *
 */
//------------------------------------------------------------------
extern void PMSDAT_Init( PMS_DATA* pms, u32 sentence_type );


//------------------------------------------------------------------
/**
 * ユニオンルームデフォルトあいさつとして初期化する
 *
 * @param   pms		文章型へのポインタ
 */
//------------------------------------------------------------------
extern void PMSDAT_SetupDefaultUnionMessage( PMS_DATA* pms );


//------------------------------------------------------------------
/**
 * カスタムなデフォルトメッセージとして初期化する
 *
 * @param   pms			文章型へのポインタ
 * @param   msgType		あいさつタイプ
 *
 */
//------------------------------------------------------------------
extern void PMSDAT_SetupDefaultMessage( PMS_DATA* pms, const PMS_DEFAULT_MSG* msg);

//------------------------------------------------------------------
/**
 * 文章型から文字列を生成。この文字列はそのままSTR_Printに回して表示できる
 *
 * @param   pms			文章型へのポインタ
 * @param   heapID		バッファ生成用ヒープID
 *
 * @retval  STRBUF*		生成された文字列を含むバッファ
 */
//------------------------------------------------------------------
extern STRBUF* PMSDAT_ToString( const PMS_DATA* pms, u32 heapID );

//------------------------------------------------------------------
/**
 * 文章型から、タグ展開前の文字列を取得。そのまま表示は不可。
 * これを使うのは、おそらく簡易会話入力画面のみ。
 *
 * @param   pms
 * @param   heapID
 *
 * @retval  STRBUF*
 */
//------------------------------------------------------------------
extern STRBUF*  PMSDAT_GetSourceString( const PMS_DATA* pms, u32 heapID );

//------------------------------------------------------------------
/**
 * 空文章になっていないかチェック
 *
 * @param   pms		文章型へのポインタ
 *
 * @retval  BOOL	TRUEで有効
 */
//------------------------------------------------------------------
extern BOOL PMSDAT_IsEnabled( const PMS_DATA* pms );

//------------------------------------------------------------------
/**
 * 文章が完成しているかチェック
 *
 * @param   pms
 *
 * @retval  BOOL
 */
//------------------------------------------------------------------
extern BOOL PMSDAT_IsComplete( const PMS_DATA* pms );


//------------------------------------------------------------------
/**
 * 設定されている文章タイプを取得
 *
 * @param   pms		文章型へのポインタ
 *
 * @retval  u32		文章タイプ（enum PMS_TYPE）
 */
//------------------------------------------------------------------
extern u32  PMSDAT_GetSentenceType( const PMS_DATA* pms );

//------------------------------------------------------------------
/**
 * 設定されている文章インデックスを返す
 *
 * @param   pms		文章型へのポインタ
 *
 * @retval  u32		文章インデックス（このままでは使い道がないハズ。入力画面用。）
 */
//------------------------------------------------------------------
extern u32 PMSDAT_GetSentenceID( const PMS_DATA* pms );

//------------------------------------------------------------------
/**
 * 設定されている単語ナンバーを取得
 *
 * @param   pms		文章型へのポインタ
 * @param   pos		何番目の単語か？
 *
 * @retval  PMS_WORD	簡易会話単語ナンバー
 */
//------------------------------------------------------------------
extern PMS_WORD  PMSDAT_GetWordNumber( const PMS_DATA* pms, int pos );

//------------------------------------------------------------------
/**
 * 内容比較
 *
 * @param   pms1
 * @param   pms2
 *
 * @retval  BOOL		一致していたらTRUEを返す
 */
//------------------------------------------------------------------
extern BOOL PMSDAT_Compare( const PMS_DATA* pms1, const PMS_DATA* pms2 );

//------------------------------------------------------------------
/**
 * 文章データのコピー
 *
 * @param   src		コピー元ポインタ
 * @param   dst		コピー先ポインタ
 *
 */
//------------------------------------------------------------------
extern void PMSDAT_Copy( PMS_DATA* dst, const PMS_DATA* src  );


//------------------------------------------------------------------
/**
 * 文章タイプから、そのタイプに含まれる文章パターンの最大数を返す
 *
 * @param   sentence_type
 *
 * @retval  u32
 */
//------------------------------------------------------------------
extern u32  PMSDAT_GetSentenceIdMax( u32 sentence_type );

//------------------------------------------------------------------
/**
 * 文章タイプ、パターンをセット
 *
 * @param   pms
 * @param   sentence_type
 * @param   sentence_id
 *
 */
//------------------------------------------------------------------
extern void PMSDAT_SetSentence( PMS_DATA* pms, u32 sentence_type, u32 sentence_id );

//------------------------------------------------------------------
/**
 *
 *
 * @param   pms
 * @param   pos
 * @param   word
 *
 */
//------------------------------------------------------------------
extern void PMSDAT_SetWord( PMS_DATA* pms, u32 pos, PMS_WORD word );


//------------------------------------------------------------------
/**
 * 文章タイプ＆IDから、使わない単語領域をクリアしておく
 *
 * @param   pms
 *
 */
//------------------------------------------------------------------
extern void PMSDAT_ClearUnnecessaryWord( PMS_DATA* pms );

#ifdef PM_DEBUG
//------------------------------------------------------------------
/**
 * テスト用に適当な内容をセットする
 *
 * @param   pms
 */
//------------------------------------------------------------------
extern void PMSDAT_SetDebug( PMS_DATA* pms );		// 固定
extern void PMSDAT_SetDebugRandom( PMS_DATA* pms );	// ランダム
#endif  // #ifdef PM_DEBUG



#endif  // #ifndef __ASM_NO_DEF_
#endif  // #ifndef __PMS_DATA_H__